﻿using System;
using System.Linq;
using System.IO;
using System.IO.IsolatedStorage;
using System.Collections.Generic;
using Microsoft.LightSwitch;
using Microsoft.LightSwitch.Framework.Client;
using Microsoft.LightSwitch.Presentation;
using Microsoft.LightSwitch.Presentation.Extensions;
using System.Windows.Controls;

namespace LightSwitchApplication
{
    public partial class OrdiniCliente_MasterDetail
    {
        const string ModalWindow = "ModalWindow";

        partial void DettagliDocumentoAddAndEditNew_Execute()
        {
            // Write your code here.
            var newDett = this.DataWorkspace.ApplicationData.DettagliDocumento.AddNew();
            newDett.Documento = Documenti.SelectedItem;
            DettagliDocumento.SelectedItem = newDett;

            this.OpenModalWindow(ModalWindow);

            this.FindControl(ModalWindow).ControlAvailable += new EventHandler<ControlAvailableEventArgs>(NewSubscriber_WindowAvailable);
        }

        void NewSubscriber_WindowAvailable(object sender, ControlAvailableEventArgs e)
        {
            this.FindControl(ModalWindow).ControlAvailable -= new EventHandler<ControlAvailableEventArgs>(NewSubscriber_WindowAvailable);

            ((ChildWindow)e.Control).Closed += new EventHandler(DocumentiListDetail_Closed);

            ((ChildWindow)e.Control).Closing += new EventHandler<System.ComponentModel.CancelEventArgs>(OrdiniCliente_MasterDetail_Closing);

            this.FindControl("MwArticolo").ControlAvailable += new EventHandler<ControlAvailableEventArgs>(DocumentiListDetail_ControlAvailable);
        }

        void OrdiniCliente_MasterDetail_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (DettagliDocumento.SelectedItem.Articolo == null)
            {
                e.Cancel = true;
            }
        }

        AutoCompleteBox ac;
        void DocumentiListDetail_Closed(object sender, EventArgs e)
        {

            this.FindControl("MwArticolo").ControlAvailable -= new EventHandler<ControlAvailableEventArgs>(DocumentiListDetail_ControlAvailable);

            if (ac != null)
                ac.LostFocus -= ac_LostFocus;

            ac = null;
        }

        void DocumentiListDetail_ControlAvailable(object sender, ControlAvailableEventArgs e)
        {
            ac = e.Control as AutoCompleteBox;
            if (ac != null)
                ac.LostFocus += new System.Windows.RoutedEventHandler(ac_LostFocus);
        }

        void ac_LostFocus(object sender, System.Windows.RoutedEventArgs e)
        {
            string txtComboText = ((System.Windows.Controls.AutoCompleteBox)sender).Text;

            this.Details.Dispatcher.BeginInvoke(() =>
            {
                if (!string.IsNullOrEmpty(txtComboText))
                {
                    var selectedCategory = this.DataWorkspace.ApplicationData.Articoli.Where(A => A.CodiceArticolo == txtComboText).FirstOrDefault();

                    if (selectedCategory == null)
                    {
                        //Category doesn't exists
                        if (this.ShowMessageBox("Do you want to add the article " + txtComboText + "?", "Add Article", MessageBoxOption.YesNo) == System.Windows.MessageBoxResult.Yes)
                        {
                            selectedCategory = this.DataWorkspace.ApplicationData.Articoli.AddNew();
                            selectedCategory.CodiceArticolo = txtComboText;
                            this.DataWorkspace.ApplicationData.SaveChanges();

                            this.DettagliDocumento.SelectedItem.Articolo = selectedCategory;
                        }
                    }
                }
            });
        }

        partial void ShowOrderDetail_Execute()
        {
            // Write your code here.
        }

  
        partial void ShowReport_Execute()
        {
            // Write your code here.
            //            this.Application.ShowReportPreviewScreen(Documenti.SelectedItem.Id);

        }

        partial void DettagliMateriale_Execute()
        {
            // Crea dettagli materiale.
            var success = CreateDettagliMaterialeRecord();

            if (success)
            {
                // Mostra schermata.
                this.Application.ShowRiepilogoMaterialeByOrdineListDetail(Documenti.SelectedItem.Id);
            }

            // Messaggio errore
        }

        private bool CreateDettagliMaterialeRecord()
        {
            var ordineId = Documenti.SelectedItem.Id;

            var ordineCliente = DataWorkspace.ApplicationData.Documenti.Where(o => o.Id == ordineId).FirstOrDefault();

            if (ordineCliente == null) return false;

            // Cancello dettagli precedenti
            while (ordineCliente.RiepilogoMateriali.Count() > 0)
                ordineCliente.RiepilogoMateriali.First().Delete();

            var dettDoc = ordineCliente.DettagliDocumento;

            /*
             * Raccolgo materiale.
             */

            DataWorkspace.ApplicationData.SaveChanges();

            foreach (var dettaglioDocumento in dettDoc)
            {
                var art = dettaglioDocumento.Articolo;
                if (art == null) continue;

                foreach (var dettaglioMaterialeArticolo in art.DettaglioMaterialeArticolo)
                {
                    var materiale = dettaglioMaterialeArticolo.MaterialeGrezzo;

                    /*
                     * Se deve essere tagliato da fornitore inserisco una voce a parte.
                     * Altrimenti cerco voce con stesso id materiale e incremento quantita.
                     */
                    if (dettaglioMaterialeArticolo.TaglioFornitore)
                    {
                        var rF = ordineCliente.RiepilogoMateriali.AddNew();

                        rF.MaterialeGrezzo = materiale;
                        rF.NumeroPezzi = dettaglioDocumento.Quantità;
                        rF.LunghezzaTaglio = dettaglioMaterialeArticolo.LunghezzaPezzo;
                        rF.TaglioInMisura = true;

                    }

                    else
                    {
                        var qtaDaAggiungere = dettaglioDocumento.Quantità *
                                              dettaglioMaterialeArticolo.LunghezzaPezzo;


                        // todo : aggiungere tagliato da fornitore.

                        var riepilogoMateriale = ordineCliente.RiepilogoMateriali;

                        var voceEsistente = riepilogoMateriale.Where(v => v.MaterialeGrezzo.Id == dettaglioMaterialeArticolo.MaterialeGrezzo.Id && !v.TaglioInMisura).FirstOrDefault();

                        if (voceEsistente != null)
                        {
                            voceEsistente.Totale += qtaDaAggiungere;
                        }
                        else
                        {
                            var r = ordineCliente.RiepilogoMateriali.AddNew();

                            r.MaterialeGrezzo = materiale;
                            r.Totale += qtaDaAggiungere;
                        }
                    }
                }
            }

            DataWorkspace.ApplicationData.SaveChanges();


            // Ora creo i dettagli del riepilogo.
            // Collego i vari dettagli documento con i riepiloghi

            var riepMateriale = ordineCliente.RiepilogoMateriali;

            foreach (var rm in riepMateriale)
            {
                foreach (var dt in dettDoc)
                {
                    var art = dt.Articolo;
                    if (art == null) continue;

                    foreach (var dettaglioMaterialeArticolo in art.DettaglioMaterialeArticolo)
                    {
                        var materiale = dettaglioMaterialeArticolo.MaterialeGrezzo;

                        if (rm.MaterialeGrezzo.Id == materiale.Id)
                        {
                            var dettRm = rm.DettaglioRiepilogoMateriali.AddNew();

                            dettRm.DettaglioDocumento = dt;
                            dettRm.DettaglioMaterialeArticolo = dettaglioMaterialeArticolo;
                        }
                    }
                }
            }

            DataWorkspace.ApplicationData.SaveChanges();

            return true;
        }

        const string NewCustomerOrder = "NewOrderDialog";
        /// <summary>
        /// Custom Nuovo ordine cliente view
        /// </summary>
        partial void DocumentoListAddAndEditNew_Execute()
        {
            // Write your code here.

            var newDett = this.DataWorkspace.ApplicationData.Documenti.AddNew();

            Documenti.SelectedItem = newDett;

            this.OpenModalWindow(NewCustomerOrder);

            //    this.FindControl(ModalWindow).ControlAvailable += new EventHandler<ControlAvailableEventArgs>(NewSubscriber_WindowAvailable);
        }

        partial void OrdiniClienteAddAndEditNew_Execute()
        {
            // Write your code here.
            var newDett = this.DataWorkspace.ApplicationData.Documenti.AddNew();

            Documenti.SelectedItem = newDett;

            this.OpenModalWindow(NewCustomerOrder);

        }

    }
}
